﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>FSF.ConvertPath</title>
<meta http-equiv="Content-Type" Content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../styles/styles.css">
<script language="javascript" src='../links.js' type="text/javascript"></script>
</head>
<body>

<h1>ConvertPath</h1>
<div class=navbar>
<a href="../index.html">главная</a> |
<a href="index.html">стандартные функции</a>
</div>

<div class=shortdescr>
Функция <code>FSF.ConvertPath</code> преобразует относительное имя файлового объекта в полное (относительно FSF.GetCurrentDirectory() - в большинстве случаев это соответствует текущему каталогу активной панели).
</div>

<p class=note>
  <img src="../../images/note.gif" alt="Замечание для ConvertPath" width="10" height="10"> Внимание!
  <ul class=note>
    <li>Не используйте для этих целей функцию <code>GetFullPathName</code> из Windows API.</li>
    <li>Не передавайте относительные имена файлов в любые функции Windows API, все относительные пути должны быть преобразованы в полные.</li>
    <li>При передаче имён в функции Windows API используйте префикс "\\?\", чтобы избежать проблемы с длинными и нестандартными именами файлов.</li>
  </ul>
</p>

<pre class=syntax>
size_t WINAPI ConvertPath(
  enum CONVERTPATHMODES Mode,
  const wchar_t *Src,
  wchar_t *Dest,
  size_t DestSize
);
</pre>

<h3>Параметры</h3>
<div class=descr>
  <div class=dfn>Mode</div>
    <div class=dfndescr>Указывает на необходимое действие. Может быть следующим (перечисление <a name="CONVERTPATHMODES">CONVERTPATHMODES</a>):
    <table class="cont">
    <tr class="cont"><th class="cont" width="40%">Действие</th><th class="cont" width="60%">Описание</th></tr>
    <tr class="cont"><td class="cont" width="40%"><a name="CPM_FULL">CPM_FULL</a></td>
    <td class="cont" width="60%"> преобразует относительное имя файлового объекта в полное</td></tr>
    <tr class="cont"><td class="cont" width="40%"><a name="CPM_REAL">CPM_REAL</a></td>
    <td class="cont" width="60%">преобразует относительное имя файлового объекта в полное, с учётом символических ссылок.</td></tr>
    <tr class="cont"><td class="cont" width="40%"><a name="CPM_NATIVE">CPM_NATIVE</a></td>
    <td class="cont" width="60%">преобразует относительное имя файлового объекта в полное, предваряя путь префиксами <code>"\\?\"</code> (для локальных объектов) или <code>"\\?\UNC\"</code> (для сетевых объектов);<br>
    это преобразование имеет смысл применять для избежания проблем с длинными и нестандартными именами файлов (см. <a class="msdocs">Naming Files, Paths, and Namespaces</a>)</td></tr>
    </table>
    </div>
  <div class=dfn>Src</div>
    <div class=dfndescr>Указатель на источник данных - полное или относительное имя файла/каталога.</div>
  <div class=dfn>Dest</div>
    <div class=dfndescr>Укзатель на строку назначения, сюда будет помещён полный путь. Установите <code>Dest = NULL</code> для того, чтобы узнать необходимый размер буфера в символах.</div>
  <div class=dfn>DestSize</div>
    <div class=dfndescr>Максимальное количество символов, которое можно поместить в <code>Dest</code>, с заключительным нулём.</div>
</div>

<h3>Возвращаемое значение</h3>
<div class=descr>
Необходимый размер буфера <code>Dest</code> в символах.
<p>Особенности <code>Mode = CPM_REAL</code>:</p>
<ul>
<li>Для монтированных дисков, которые не имеют буквы диска, функция поместит в <code>Dest</code> строку, подобную этой: <code>"\\?\Volume{273872e0-5e49-11d5-b614-0080ad70bb9b}\Foo.bar"</code>
<li>Если, например, каталог <code>"D:\Foo\Bar"</code> является симлинком для реально существующего <code>"C:\work\Doc"</code>, то функция для файла <code>"D:\Foo\Bar\1092\readme.txt"</code> вернёт <code>"C:\work\Doc\1092\readme.txt"</code>
</ul>
</div>

<h3>Замечания</h3>
<div class=descr>
<ol>
<li>Параметры <code>Src</code> и <code>Dest</code> могут ссылаться на одну и ту же строку.
</ol>
</div>

<h3>Пример</h3>
<div class=descr>
<p>Неправильно:</p>
<pre class=code>
   GetFileAttributes(L"..\\some_file");
</pre>

<p>Правильно:</p>
<pre class=code>
   std::vector&lt;wchar_t&gt; Buffer(MAX_PATH);

   for (;;)
   {
     const auto ActualSize = FSF.ConvertPath(CPM_FULL, L"..\\some_file", Buffer.data(), Buffer.size());

     if (ActualSize &lt;= Buffer.size())
        break;

     Buffer.resize(ActualSize);
   }

   GetFileAttributes(Buffer.data());
</pre>
</div>

<div class=see>Смотрите также:</div>
<div class=seecont>
</div>

</body>
</html>
